package day1;

import org.junit.Test;

import java.util.Arrays;
import java.util.Random;


public class UniqueRandomGenerator {
@Test
    public void test03() {
        int[] randomNumbers = generateUniqueRandomNumbers(6, 1, 33);
        System.out.println("生成的6个不重复随机数: " + Arrays.toString(randomNumbers));
    }

    /**
     * 生成指定数量的不重复随机数
     *
     * @param count 需要生成的随机数数量
     * @param min 随机数范围最小值(包含)
     * @param max 随机数范围最大值(包含)
     * @return 包含不重复随机数的数组
     */
    public static int[] generateUniqueRandomNumbers(int count, int min, int max) {
        // 验证输入有效性
        if (count <= 0) {
            throw new IllegalArgumentException("生成数量必须大于0");
        }
        if (min > max) {
            throw new IllegalArgumentException("最小值不能大于最大值");
        }

        int range = max - min + 1;
        if (count > range) {
            throw new IllegalArgumentException("生成数量不能超过可选范围");
        }

        // 创建标记数组和结果数组
        boolean[] flags = new boolean[range + 1]; // 索引0不使用，使用1到max
        int[] result = new int[count];
        Random random = new Random();

        int generated = 0; // 已生成的不重复随机数数量

        while (generated < count) {
            // 生成[min, max]范围内的随机数
            int num = random.nextInt(range) + min;

            // 如果该数字尚未被标记
            if (!flags[num]) {
                // 将数字添加到结果数组
                result[generated] = num;
                // 在标记数组中标记该数字
                flags[num] = true;
                // 增加已生成计数
                generated++;

                // 打印标记数组状态（调试用）
                System.out.println("生成数字: " + num + ", 标记数组状态: " + getFlagsStatus(flags, min, max));
            }
        }

        return result;
    }

    /**
     * 获取标记数组的可视化状态（用于调试）
     */
    private static String getFlagsStatus(boolean[] flags, int min, int max) {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = min; i <= max; i++) {
            if (flags[i]) {
                sb.append(i).append("(T)");
            } else {
                sb.append(i).append("(F)");
            }
            if (i < max) {
                sb.append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }
}